package com.gao.utils;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import com.gao.annotation.Like;

import java.lang.reflect.Field;

/**
 * @Description mybatis-Plus 的一些工具类
 * @Author anshenghui
 * @Date 2021/10/13
 * @Version 1.0
 */
@Slf4j
public class MyBatisPlusUtil {

    /**
     * 根据传入的实体类对其属性值进行判空操作，带入条件构造器  如果调教构造器上面有注解@TableField 则取注解里面的值
     *      注：该方法仅对注解TableField 和 里面的属性值value和exist 进行了判断  如果需要其他属性值 可以自行构造QueryWrapper
     *          或者执行自定义dql
     *      默认为eq查询  如果实体类中的某个字段想要模糊查询  只需要在实体类的属性上加上{@link Like}即可
     * @param object
     * @param <T>
     * @return
     */
    public static <T> QueryWrapper<T> getQueryWrapper(T object) {
        QueryWrapper<T> queryWrapper = new QueryWrapper<>();
        Class<?> obj = object.getClass();
        Field[] fields = obj.getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            fields[i].setAccessible(true);
        }
        for (Field field : fields) {
            try {
                if (field.get(object) != null && !field.getName().equals("serialVersionUID")) {
                    TableField tableField = field.getDeclaredAnnotation(TableField.class);
                    Like like = field.getDeclaredAnnotation(Like.class);
                    if (tableField == null) {
                        String name = field.getName();
                        if (like != null) {
                            queryWrapper.like(toSqlName(name), field.get(object));
                        } else {
                            queryWrapper.eq(toSqlName(name), field.get(object));
                        }
                    } else {
                        if (tableField.exist()) {
                            String annoValue = tableField.value();
                            if (like != null) {
                                queryWrapper.like(annoValue, field.get(object));
                            } else {
                                queryWrapper.eq(annoValue, field.get(object));
                            }
                        }
                    }
                }
            } catch (IllegalAccessException e) {
                log.warn("条件构造器初始化失败");
                e.printStackTrace();
            }

        }
        return queryWrapper;
    }


    /**
     * 将实体类中的属性名字，改成对应的数据库字段
     * /-/-/-/-/-/-    注：数据库必须是下划线名称且全部小写，实体类字段名必须驼峰命名（除非加入TableField注解）
     */
    public static String toSqlName(String fieldName) {
        char[] charArray = fieldName.toCharArray();
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < charArray.length; i++) {
            if (charArray[i] >= 'A' && charArray[i] <= 'Z') {
                stringBuilder.append("_").append(charArray[i]);
            } else {
                stringBuilder.append(charArray[i]);
            }
        }
        return stringBuilder.toString().toLowerCase();
    }
}
